home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / test / test_profilehooks.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  13KB  |  484 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. import pprint
  5. import sys
  6. import unittest
  7. from test import test_support
  8.  
  9. class HookWatcher:
  10.     
  11.     def __init__(self):
  12.         self.frames = []
  13.         self.events = []
  14.  
  15.     
  16.     def callback(self, frame, event, arg):
  17.         if event == 'call' and event == 'return' or event == 'exception':
  18.             self.add_event(event, frame)
  19.         
  20.  
  21.     
  22.     def add_event(self, event, frame = None):
  23.         '''Add an event to the log.'''
  24.         if frame is None:
  25.             frame = sys._getframe(1)
  26.         
  27.         
  28.         try:
  29.             frameno = self.frames.index(frame)
  30.         except ValueError:
  31.             frameno = len(self.frames)
  32.             self.frames.append(frame)
  33.  
  34.         self.events.append((frameno, event, ident(frame)))
  35.  
  36.     
  37.     def get_events(self):
  38.         '''Remove calls to add_event().'''
  39.         disallowed = [
  40.             ident(self.add_event.im_func),
  41.             ident(ident)]
  42.         self.frames = None
  43.         return _[1]
  44.  
  45.  
  46.  
  47. class ProfileSimulator(HookWatcher):
  48.     
  49.     def __init__(self, testcase):
  50.         self.testcase = testcase
  51.         self.stack = []
  52.         HookWatcher.__init__(self)
  53.  
  54.     
  55.     def callback(self, frame, event, arg):
  56.         self.dispatch[event](self, frame)
  57.  
  58.     
  59.     def trace_call(self, frame):
  60.         self.add_event('call', frame)
  61.         self.stack.append(frame)
  62.  
  63.     
  64.     def trace_return(self, frame):
  65.         self.add_event('return', frame)
  66.         self.stack.pop()
  67.  
  68.     
  69.     def trace_exception(self, frame):
  70.         self.testcase.fail('the profiler should never receive exception events')
  71.  
  72.     
  73.     def trace_pass(self, frame):
  74.         pass
  75.  
  76.     dispatch = {
  77.         'call': trace_call,
  78.         'exception': trace_exception,
  79.         'return': trace_return,
  80.         'c_call': trace_pass,
  81.         'c_return': trace_pass,
  82.         'c_exception': trace_pass }
  83.  
  84.  
  85. class TestCaseBase(unittest.TestCase):
  86.     
  87.     def check_events(self, callable, expected):
  88.         events = capture_events(callable, self.new_watcher())
  89.         if events != expected:
  90.             self.fail('Expected events:\n%s\nReceived events:\n%s' % (pprint.pformat(expected), pprint.pformat(events)))
  91.         
  92.  
  93.  
  94.  
  95. class ProfileHookTestCase(TestCaseBase):
  96.     
  97.     def new_watcher(self):
  98.         return HookWatcher()
  99.  
  100.     
  101.     def test_simple(self):
  102.         
  103.         def f(p):
  104.             pass
  105.  
  106.         f_ident = ident(f)
  107.         self.check_events(f, [
  108.             (1, 'call', f_ident),
  109.             (1, 'return', f_ident)])
  110.  
  111.     
  112.     def test_exception(self):
  113.         
  114.         def f(p):
  115.             1 / 0
  116.  
  117.         f_ident = ident(f)
  118.         self.check_events(f, [
  119.             (1, 'call', f_ident),
  120.             (1, 'return', f_ident)])
  121.  
  122.     
  123.     def test_caught_exception(self):
  124.         
  125.         def f(p):
  126.             
  127.             try:
  128.                 1 / 0
  129.             except:
  130.                 pass
  131.  
  132.  
  133.         f_ident = ident(f)
  134.         self.check_events(f, [
  135.             (1, 'call', f_ident),
  136.             (1, 'return', f_ident)])
  137.  
  138.     
  139.     def test_caught_nested_exception(self):
  140.         
  141.         def f(p):
  142.             
  143.             try:
  144.                 1 / 0
  145.             except:
  146.                 pass
  147.  
  148.  
  149.         f_ident = ident(f)
  150.         self.check_events(f, [
  151.             (1, 'call', f_ident),
  152.             (1, 'return', f_ident)])
  153.  
  154.     
  155.     def test_nested_exception(self):
  156.         
  157.         def f(p):
  158.             1 / 0
  159.  
  160.         f_ident = ident(f)
  161.         self.check_events(f, [
  162.             (1, 'call', f_ident),
  163.             (1, 'return', f_ident)])
  164.  
  165.     
  166.     def test_exception_in_except_clause(self):
  167.         
  168.         def f(p):
  169.             1 / 0
  170.  
  171.         
  172.         def g(p):
  173.             
  174.             try:
  175.                 f(p)
  176.             except:
  177.                 
  178.                 try:
  179.                     f(p)
  180.  
  181.  
  182.  
  183.         f_ident = ident(f)
  184.         g_ident = ident(g)
  185.         self.check_events(g, [
  186.             (1, 'call', g_ident),
  187.             (2, 'call', f_ident),
  188.             (2, 'return', f_ident),
  189.             (3, 'call', f_ident),
  190.             (3, 'return', f_ident),
  191.             (1, 'return', g_ident)])
  192.  
  193.     
  194.     def test_exception_propogation(self):
  195.         
  196.         def f(p):
  197.             1 / 0
  198.  
  199.         
  200.         def g(p):
  201.             
  202.             try:
  203.                 f(p)
  204.             finally:
  205.                 p.add_event('falling through')
  206.  
  207.  
  208.         f_ident = ident(f)
  209.         g_ident = ident(g)
  210.         self.check_events(g, [
  211.             (1, 'call', g_ident),
  212.             (2, 'call', f_ident),
  213.             (2, 'return', f_ident),
  214.             (1, 'falling through', g_ident),
  215.             (1, 'return', g_ident)])
  216.  
  217.     
  218.     def test_raise_twice(self):
  219.         
  220.         def f(p):
  221.             
  222.             try:
  223.                 1 / 0
  224.             except:
  225.                 1 / 0
  226.  
  227.  
  228.         f_ident = ident(f)
  229.         self.check_events(f, [
  230.             (1, 'call', f_ident),
  231.             (1, 'return', f_ident)])
  232.  
  233.     
  234.     def test_raise_reraise(self):
  235.         
  236.         def f(p):
  237.             
  238.             try:
  239.                 1 / 0
  240.             except:
  241.                 raise 
  242.  
  243.  
  244.         f_ident = ident(f)
  245.         self.check_events(f, [
  246.             (1, 'call', f_ident),
  247.             (1, 'return', f_ident)])
  248.  
  249.     
  250.     def test_raise(self):
  251.         
  252.         def f(p):
  253.             raise Exception()
  254.  
  255.         f_ident = ident(f)
  256.         self.check_events(f, [
  257.             (1, 'call', f_ident),
  258.             (1, 'return', f_ident)])
  259.  
  260.     
  261.     def test_distant_exception(self):
  262.         
  263.         def f():
  264.             1 / 0
  265.  
  266.         
  267.         def g():
  268.             f()
  269.  
  270.         
  271.         def h():
  272.             g()
  273.  
  274.         
  275.         def i():
  276.             h()
  277.  
  278.         
  279.         def j(p):
  280.             i()
  281.  
  282.         f_ident = ident(f)
  283.         g_ident = ident(g)
  284.         h_ident = ident(h)
  285.         i_ident = ident(i)
  286.         j_ident = ident(j)
  287.         self.check_events(j, [
  288.             (1, 'call', j_ident),
  289.             (2, 'call', i_ident),
  290.             (3, 'call', h_ident),
  291.             (4, 'call', g_ident),
  292.             (5, 'call', f_ident),
  293.             (5, 'return', f_ident),
  294.             (4, 'return', g_ident),
  295.             (3, 'return', h_ident),
  296.             (2, 'return', i_ident),
  297.             (1, 'return', j_ident)])
  298.  
  299.     
  300.     def test_generator(self):
  301.         
  302.         def f():
  303.             for i in range(2):
  304.                 yield i
  305.             
  306.  
  307.         
  308.         def g(p):
  309.             for i in f():
  310.                 pass
  311.             
  312.  
  313.         f_ident = ident(f)
  314.         g_ident = ident(g)
  315.         self.check_events(g, [
  316.             (1, 'call', g_ident),
  317.             (2, 'call', f_ident),
  318.             (2, 'return', f_ident),
  319.             (2, 'call', f_ident),
  320.             (2, 'return', f_ident),
  321.             (2, 'call', f_ident),
  322.             (2, 'return', f_ident),
  323.             (1, 'return', g_ident)])
  324.  
  325.     
  326.     def test_stop_iteration(self):
  327.         
  328.         def f():
  329.             for i in range(2):
  330.                 yield i
  331.             
  332.             raise StopIteration
  333.  
  334.         
  335.         def g(p):
  336.             for i in f():
  337.                 pass
  338.             
  339.  
  340.         f_ident = ident(f)
  341.         g_ident = ident(g)
  342.         self.check_events(g, [
  343.             (1, 'call', g_ident),
  344.             (2, 'call', f_ident),
  345.             (2, 'return', f_ident),
  346.             (2, 'call', f_ident),
  347.             (2, 'return', f_ident),
  348.             (2, 'call', f_ident),
  349.             (2, 'return', f_ident),
  350.             (1, 'return', g_ident)])
  351.  
  352.  
  353.  
  354. class ProfileSimulatorTestCase(TestCaseBase):
  355.     
  356.     def new_watcher(self):
  357.         return ProfileSimulator(self)
  358.  
  359.     
  360.     def test_simple(self):
  361.         
  362.         def f(p):
  363.             pass
  364.  
  365.         f_ident = ident(f)
  366.         self.check_events(f, [
  367.             (1, 'call', f_ident),
  368.             (1, 'return', f_ident)])
  369.  
  370.     
  371.     def test_basic_exception(self):
  372.         
  373.         def f(p):
  374.             1 / 0
  375.  
  376.         f_ident = ident(f)
  377.         self.check_events(f, [
  378.             (1, 'call', f_ident),
  379.             (1, 'return', f_ident)])
  380.  
  381.     
  382.     def test_caught_exception(self):
  383.         
  384.         def f(p):
  385.             
  386.             try:
  387.                 1 / 0
  388.             except:
  389.                 pass
  390.  
  391.  
  392.         f_ident = ident(f)
  393.         self.check_events(f, [
  394.             (1, 'call', f_ident),
  395.             (1, 'return', f_ident)])
  396.  
  397.     
  398.     def test_distant_exception(self):
  399.         
  400.         def f():
  401.             1 / 0
  402.  
  403.         
  404.         def g():
  405.             f()
  406.  
  407.         
  408.         def h():
  409.             g()
  410.  
  411.         
  412.         def i():
  413.             h()
  414.  
  415.         
  416.         def j(p):
  417.             i()
  418.  
  419.         f_ident = ident(f)
  420.         g_ident = ident(g)
  421.         h_ident = ident(h)
  422.         i_ident = ident(i)
  423.         j_ident = ident(j)
  424.         self.check_events(j, [
  425.             (1, 'call', j_ident),
  426.             (2, 'call', i_ident),
  427.             (3, 'call', h_ident),
  428.             (4, 'call', g_ident),
  429.             (5, 'call', f_ident),
  430.             (5, 'return', f_ident),
  431.             (4, 'return', g_ident),
  432.             (3, 'return', h_ident),
  433.             (2, 'return', i_ident),
  434.             (1, 'return', j_ident)])
  435.  
  436.  
  437.  
  438. def ident(function):
  439.     if hasattr(function, 'f_code'):
  440.         code = function.f_code
  441.     else:
  442.         code = function.func_code
  443.     return (code.co_firstlineno, code.co_name)
  444.  
  445.  
  446. def protect(f, p):
  447.     
  448.     try:
  449.         f(p)
  450.     except:
  451.         pass
  452.  
  453.  
  454. protect_ident = ident(protect)
  455.  
  456. def capture_events(callable, p = None):
  457.     
  458.     try:
  459.         sys.setprofile()
  460.     except TypeError:
  461.         pass
  462.  
  463.     raise test_support.TestFailed('sys.setprofile() did not raise TypeError')
  464.     if p is None:
  465.         p = HookWatcher()
  466.     
  467.     sys.setprofile(p.callback)
  468.     protect(callable, p)
  469.     sys.setprofile(None)
  470.     return p.get_events()[1:-1]
  471.  
  472.  
  473. def show_events(callable):
  474.     import pprint
  475.     pprint.pprint(capture_events(callable))
  476.  
  477.  
  478. def test_main():
  479.     test_support.run_unittest(ProfileHookTestCase, ProfileSimulatorTestCase)
  480.  
  481. if __name__ == '__main__':
  482.     test_main()
  483.  
  484.